在 MySQL 8.0 之前,Server 层和存储引擎(比如 InnoDB)会各自保留一份元数据(schema name, table definition 等),不仅在信息存储上有着重复冗余,而且可能存在两者之间存储的元数据不同步的现象。不同存储引擎之间(比如 InnoDB 和 MyISAM)有着不同的元数据存储形式和位置(.FRM, .PAR, .OPT, .TRN and .TRG files),造成了元数据无法统一管理。此外,将元数据存放在不支持事务的表和文件中,使得 DDL 变更不会是原子的,crash recovery 也会成为一个问题。
在 MySQL 的索引体系中,聚集索引和非聚集索引是非常重要的概念。聚集索引基于主键创建,它不仅仅是一种索引类型,更代表着一种数据的存储方式。在 InnoDB 存储引擎里,一张表的数据对应的物理文件是按照 B + 树来组织的索引结构,而聚集索引就是按照每张表的主键构建的 B + 树,叶子节点存储了表的每一行数据记录 。这就意味着每个表必须有一个主键,如果没有,InnoDB 会默认选择或添加一个隐藏列作为主键索引来存储数据行。通常建议使用自增 id 作为主键,因为自增 id 具有连续性,能使对应的数据按顺序存储在磁盘上,从而提升写入和检索性能。而像 uuid 这种随机 id,在频繁插入数据时,会导致随机磁盘 IO,性能较低。